package com.kevin.model.config;

import java.util.List;
import java.util.Map;

import javax.servlet.ServletContext;

import com.kevin.util.properties.PropertiesUtil;

/**
 * 配置文件类
 * 
 * @ClassName SysconfigAction
 * @author <a href="mailto:donggongai@126.com" target="_blank">kevin</a>
 * @date 2014-6-21 下午2:37:40
 * 
 */
public class PropertiesModel {
    private static ServletContext context = null;
    public static final PropertiesUtil CONFIG = new PropertiesUtil("config.properties") {
        /**
         * 
         * 保存成功的回调函数
         * 
         * @Title saveCallback
         * @author 吕凯
         * @date 2017年12月20日 下午6:01:40 void
         */
        @Override
        public void saveCallback(String key, String value) {
            refreshConfig2Context(key, value); // 写到上下文中实时更新
        }

        /**
         * 
         * 保存成功的回调函数
         * 
         * @Title saveCallback
         * @author 吕凯
         * @date 2017年12月20日 下午6:01:40 void
         */
        @Override
        public void saveCallback(Map<String, Object> proMap) {
            refreshConfig2Context(); // 写到上下文中实时更新

        }

    };
    public static final PropertiesUtil APPLICATION = new PropertiesUtil("application.properties") {
        /**
         * 
         * 保存成功的回调函数
         * 
         * @Title saveCallback
         * @author 吕凯
         * @date 2017年12月20日 下午6:01:40 void
         */
        @Override
        public void saveCallback(String key, String value) {
            refreshApplication2Context(key, value); // 写到上下文中实时更新
        }

        /**
         * 
         * 保存成功的回调函数
         * 
         * @Title saveCallback
         * @author 吕凯
         * @date 2017年12月20日 下午6:01:40 void
         */
        @Override
        public void saveCallback(Map<String, Object> proMap) {
            refreshApplication2Context(); // 写到上下文中实时更新
        }

    };

    /**
     * 刷新项目配置参数到上下文
     * 
     * @Title refreshProjectConfig
     * @author 吕凯
     * @date 2016年11月1日 下午4:22:04
     * @param context
     *            void
     */
    public static void refreshConfig2Context() {
        List<String> keys = CONFIG.getKeys();
        if (context != null) {
            keys.stream().forEach(key -> {
                String value = CONFIG.getString(key);
                context.setAttribute(key, value);
            });
        }
    }

    public static void refreshConfig2Context(String key, String value) {
        if (context != null) {
            context.setAttribute(key, value);
        }
    }

    /**
     * 刷新配置项参数到上下文
     * 
     * @Title refreshApplication2Context
     * @author 吕凯
     * @date 2017年12月20日 下午5:54:38
     * @param context
     *            void
     */
    public static void refreshApplication2Context() {
        List<String> keys = APPLICATION.getKeys();
        if (context != null) {
            keys.stream().forEach(key -> {
                String value = APPLICATION.getString(key);
                context.setAttribute(key, value);
            });
        }
    }

    public static void refreshApplication2Context(String key, String value) {
        if (context != null) {
            context.setAttribute(key, value);
        }
    }

    /**
     * 注册上下文变量
     * 
     * @Title registerContext
     * @author 吕凯
     * @date 2017年12月21日 上午8:35:23
     * @param contextParam
     *            void
     */
    public static void registerContext(ServletContext contextParam) {
        if (context == null) {
            context = contextParam;
        }
        refreshConfig2Context();
        refreshApplication2Context();
    }

    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            System.out.println(PropertiesModel.CONFIG.getList("tt"));
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println(PropertiesModel.CONFIG.getPropertys());
//        PropertiesModel.CONFIG.save("tt", "100");
    }

}
